package innova.dao;

import innova.modelo.Discusion;
import innova.modelo.Permitido;
import innova.util.ConexionBD;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

public class DiscusionDAO extends BaseDAO {
	
//	private int idDiscusion;
//	private String descripcionDiscusion;
//	private Permitido permitido;
	
	public Collection<Discusion> buscarPorDescripcion(String descripcionDiscusion)
			throws Exception {
		String query = "select"
				+ " idDiscusion, "
				+ " descripcionDiscusion, "
				+ " idPermitido "
				+ " from Discusion "
				+ " where descripcionDiscusion like ?";
		Collection<Discusion> lista = new ArrayList<Discusion>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, "%" + descripcionDiscusion + "%");
			rs = stmt.executeQuery();
			while (rs.next()) {
				Discusion vo = new Discusion();
				vo.setIdDiscusion(rs.getInt("idDiscusion"));
				vo.setDescripcionDiscusion(rs.getString("descripcionDiscusion"));
				
				//Creando otra entidad
				Permitido permitido = new Permitido();
				permitido.setIdPermitido(rs.getInt("idPermitido"));
				vo.setPermitido(permitido);
				
				lista.add(vo);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new Exception(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		System.out.println(lista.size());
		return lista;
	}

	public Discusion insertar(Discusion vo) throws Exception {
		String query = "insert into Discusion("
				+ " descripcionDiscusion, "
				+ " idPermitido"
				+ " ) "
				+ " values (?,?)";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, vo.getDescripcionDiscusion());
			stmt.setInt(2, vo.getPermitido().getIdPermitido());
			
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new Exception(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}

	public Discusion obtener(int idDiscusion) throws Exception {
		Discusion vo = new Discusion();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "select"
					+ " idDiscusion, "
					+ " descripcionDiscusion, "
					+ " idPermitido "
					+ " from Discusion "
					+ " where idDiscusion = ?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, idDiscusion);
			rs = stmt.executeQuery();
			if (rs.next()) {
				vo.setIdDiscusion(rs.getInt("idDiscusion"));
				vo.setDescripcionDiscusion(rs.getString("descripcionDiscusion"));
				
				//Creando otra entidad
				Permitido permitido = new Permitido();
				permitido.setIdPermitido(rs.getInt("idPermitido"));
				vo.setPermitido(permitido);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new Exception(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}

	public void eliminar(int idDiscusion) throws Exception {
		String query = "delete from Discusion "
				+ " where idDiscusion = ?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, idDiscusion);
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo eliminar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new Exception(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

	public Discusion actualizar(Discusion vo) throws Exception {
		String query = "update discusion set "
				+ " descripcionDiscusion = ?, "
				+ " idPermitido = ? "
				+ " where idDiscusion = ?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, vo.getDescripcionDiscusion());
			stmt.setInt(2, vo.getPermitido().getIdPermitido());
			stmt.setInt(3, vo.getIdDiscusion());
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo actualizar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new Exception(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}

	public Collection<Discusion> listar() throws Exception {
		Collection<Discusion> c = new ArrayList<Discusion>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "select"
					+ " idDiscusion, "
					+ " descripcionDiscusion, "
					+ " idPermitido "
					+ " from Discusion "
					+ " order by idDiscusion";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Discusion vo = new Discusion();
				vo.setIdDiscusion(rs.getInt("idDiscusion"));
				vo.setDescripcionDiscusion(rs.getString("descripcionDiscusion"));
				
				//Creando otra entidad
				Permitido permitido = new Permitido();
				permitido.setIdPermitido(rs.getInt("idPermitido"));
				vo.setPermitido(permitido);
				
				c.add(vo);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new Exception(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}

	public Collection<Discusion> buscarPorPermitido(int idPermitido)
			throws Exception {
		String query = "select"
				+ " idDiscusion, "
				+ " descripcionDiscusion, "
				+ " idPermitido "
				+ " from Discusion "
				+ " where idPermitido = ?";
		Collection<Discusion> lista = new ArrayList<Discusion>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, idPermitido);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Discusion vo = new Discusion();
				vo.setIdDiscusion(rs.getInt("idDiscusion"));
				vo.setDescripcionDiscusion(rs.getString("descripcionDiscusion"));
				
				//Creando otra entidad
				Permitido permitido = new Permitido();
				permitido.setIdPermitido(rs.getInt("idPermitido"));
				vo.setPermitido(permitido);
				
				lista.add(vo);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new Exception(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		
		return lista;
	}
	
}
